package com.ctshk.rpc.order.tour.service;

import com.ctshk.common.dto.Result;
import com.ctshk.common.dto.payment.CallPayDTO;
import com.ctshk.common.model.AppReq;
import com.ctshk.common.model.PageResponse;
import com.ctshk.common.model.TokenUser;
import com.ctshk.common.req.pay.NotifyConsumeReq;
import com.ctshk.rpc.order.tour.dto.*;
import com.ctshk.rpc.order.tour.dto.client.ClientOrderDetailsDTO;
import com.ctshk.rpc.order.tour.dto.client.PCClientOrderDetailsDTO;
import com.ctshk.rpc.order.tour.dto.custom.CustomOrderUpdateContactDTO;
import com.ctshk.rpc.order.tour.req.*;
import com.ctshk.rpc.order.tour.req.client.ClientOrderCancelReq;
import com.ctshk.rpc.order.tour.req.client.ClientOrderInfoReq;
import com.ctshk.rpc.order.tour.req.client.ClientSeriesOrderAddReq;
import com.ctshk.rpc.order.tour.req.custom.CustomOrderUpdateContactReq;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 系列团订单 服务类
 * </p>
 *
 * @author 谭响
 * @since 2021-01-18
 */
public interface ISeriesOrderService {

    /**
     * 下单
     */
    Result<SeriesOrderDTO> down(SeriesOrderDownReq seriesOrderDownReq, TokenUser tokenUser);

    /**
     * 确认订单
     */
    Result<SeriesOrderDTO> confirm(SeriesOrderConfirmReq seriesOrderConfirmReq);

    /**
     * 追位
     */
    Result<SeriesOrderDTO> additional(SeriesOrderAdditionalReq seriesOrderAdditionalReq);

    /**
     * 列表
     */
    Result<SeriesOrderListDTO> list(SeriesOrderListReq seriesOrderListReq, TokenUser currentUser);

    /**
     * 列表跨店
     */
    PageResponse<SeriesOrderListSpanDTO> listSpan(SeriesOrderListSpanReq req);

    /**
     * 追位确认
     */
    Result additionalConfirm(SeriesOrderAdditionalConfirmReq seriesOrderAdditionalConfirmReq);

    /**
     * 留位
     */
    Result<SeriesOrderDTO> keep(SeriesOrderKeepReq seriesOrderKeepReq, TokenUser tokenUser);

    /**
     * 留位确认
     */
    Result<SeriesOrderDTO> keepConfirm(SeriesOrderKeepConfirmReq seriesOrderKeepConfirmReq);

    /**
     * 详情
     */
    Result<SeriesOrderDetailDTO> detail(SeriesOrderDetailReq seriesOrderListReq);

    /**
     * 取消
     */
    Result cancel(SeriesOrderCancelReq req);

    /**
     * 追位审核
     */
    Result additionalApproval(SeriesOrderAdditionalApprovalReq req, TokenUser tokenUser);

    /**
     * 计算单房差-B端
     */
    Result<SeriesOrderCalculationDTO> calculation(SeriesOrderCalculationReq req);

    /**
     * 计算单房差-C端
     */
    Result<SeriesOrderCalculationToCDTO> calculationToC(SeriesOrderCalculationReq req);

    /**
     * 关闭占位
     */
    Result closeOccupy(Long orderId);

    /**
     * 关闭留位
     */
    Result closeKeep(Long orderId);

    /**
     * 绑定会员
     */
    Result bindMember(SeriesOrderBindMemberReq req);
    
    /**
     * 查询所属系列团团期ID列表
     * @param req
     * @return
     */
    List<Long> queryMyGroupId(SeriesOrderMyGroupIdQueryReq req);

    /**
     * 获取订单号
     */
    String getOrderNumber(Long userId);

    /**
     * 获取退团单号
     */
    String getQuitNumber();

    /**
     * 获取发票订单号
     */
    String getInvoiceNumber(Long userId);
    /**
     * 获取收据订单号（销售）
     */
    String getReceiptNumberSale(Long userId);

    /**
     * 获取收据订单号（保险）
     */
    String getReceiptNumberInsurance(Long userId);

    /**
     * 获取收据单号（通知书）
     */
    String getReceiptNumberQuit(Long userId);

    /**
     * 获取收款单号
     */
    String getCollectionNumber();

    /**
     * 获取退款单号
     */
    String getRefundNumber();

    /**
     * 旅游团-下单（C端）
     * @param req
     * @return
     */
    Result add(ClientSeriesOrderAddReq req, AppReq appReq);

    /**
     * 取消订单（C端）
     * @param req
     * @return
     */
    Result cancel2(ClientOrderCancelReq req);

    /**
     * 支付回调
     * @param req
     * @return
     */
    Result payment(NotifyConsumeReq req);

    /**
     * 支付结果
     * @param orderId
     * @return
     */
    Result<SeriesOrderPayDTO> payResult(Long orderId);

    /**
     * 最近一次查询结束时间到当前时间的数据
     */
    Result<List<MyTripOrderDTO>> recentToNow(LocalDateTime recent, LocalDateTime now);

    /**
     * 最近一次查询结束时间到当前时间的订单DTO
     */
    List<SeriesOrderDTO> queryOrderDTOList(LocalDateTime recent, LocalDateTime now);

    /**
     * 查询行程团期销量
     * @param ids
     * @return
     */
    List<SeriesOrderDTO> selectList(List<Long> ids);

    /**
     * C端旅游团-订单详情
     * @param req
     * @return
     */
    Result<ClientOrderDetailsDTO> info(ClientOrderInfoReq req);

    /**
     * C端旅游团-订单详情
     * @param req
     * @return
     */
    Result<PCClientOrderDetailsDTO> infoToPc(ClientOrderInfoReq req);

    /**
     * 修改联络人信息
     * @param req
     * @return
     */
    Result<CustomOrderUpdateContactDTO> updateContact(CustomOrderUpdateContactReq req);

    /**
     * 旅行团订单信息
     * @param orderId
     * @return
     */
    Result<OrderInfoDTO> orderInfo(Long orderId);

    /**
     * C端唤起支付获取订单信息
     * @param id
     * @return
     */
    CallPayDTO getCallPayInfo(Long id,int type);

    /**
     * C端 订单详情页-行程详情-跳转请前判断
     * @param req
     * @return
     */
    Result tripIsExist(TripIsExistReq req);

    /**
     * 余位校验
     * @param req
     * @return
     */
    Result remainCheck(RemainCheckReq req);

    /**
     * 获取退款理由
     * @return
     */
    Result<List<RefundReasonDTO>> RefundReason();

    /**
     * 支付超时
     * @param id
     * @return
     */
    Result notPaid(Long id);
}
